package com.itheima.aop;

import lombok.val;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
/*
* 入门步骤
        1)导入坐标
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</antifactId》
</dependency>
        2)编写aop 工具类
            @Aspect
            @component
    方法上
            @Around
        3)重启,测试(点击页面查询数据,看控制台即可)
            注意:建议注释掉过滤器和拦截器相关代
* */
/*
* 2.    AOP 概念:
                  面向切面编程(面向方面编程)
                 通俗理解: 程序员面向的不再是某一个业务功能的开发,而是面向的某一方面统一功能的开发
                 叫:面向方面(切面)编程 Aspect oriented Programming
        作用: 在不修改源码的基础上,统一增强代码逻辑
        底层原理:动态代理（jdk代理）

 常见的应用场景：
        *       1）：统一日志记录
        *       2）：权限控制（例如有20个权限，只有管理员有权限）
        *       3）：事务
        * 优势：
        *       代码无入侵
        *       减少重复代码
        *       方便开发和后期维护
* aop基础概念：（直接拿servlet来做举例子）
*       常见的概念
            3.aop
                切入点:真正被增强的方法（这个指的就是servlet里面所有方法里面的一个方法）
                连接点:可以被增强的方法（其实可以理解为servlice里面的所有方法。举例（sava,delete,update,findbyid等方法））
                    连接点>切入点
                通知 : 增强的逻辑
                (通常表现为一个方法，指的就是TimeAspect里面的方法体就是long strat  = System.currentimeMills();一直到long end=System.currentTimeMills();完之后才算通知)
                切面:通知 + 切入点
                切面类:切面所在的类（说白了就是方法名那一行）
                目标对象:被增强的类（就是servleri实现类）
* */
import org.springframework.stereotype.Component;

//放入Spring容器里面
//@Component
//告知Spring这是Aop的一个增强工具类
//@Aspect
public class TimeAspect {

    //现在就是加注解：就是说哪些方法要计算消耗时间（固定写法)

    @Around("execution(* com.itheima.service.impl.*.*(..))")
//里面有两个*-----第一个代表impl下面的实现类，第二个就是实现类里面的所有方法
//(..)里面的就是有参构造无参构造的方法都执行
    //对目标方法进行处理
    public Object recordTime(ProceedingJoinPoint pjp) throws Throwable {

    //记录开始的时间
      long start =   System.currentTimeMillis();
      //对目标方法进行一次调用
       Object object = pjp.proceed();
    //记录结束时间
        long end = System.currentTimeMillis();
        System.out.println("方法执行的时间："+(end-start)+"ms");
        return object;
    }


}
